269. PVC backup and restore

WHY

又來個問題,PVC有辦法備份嗎?
本來是想用第二個掛載volume的方式,
將資料備份出來,但GKE的volume只支援ReadWriteOnce。

Note

kubectl api-resources | grep volumesnapshot

有的話,應該會看到類似這樣的訊息

269-fig.1.png

Step 2. 確認要備份pvc的CSI driver

顯示全部的CSI driver
kubectl get csidrivers

根據storageclass查詢(Provisioner欄位)
kubectl get sc -o wide

查pv的CSI driver(CSI.driver欄位)
kubectl get pv <volume-name> -o yaml

Step 3. 建立VolumeSnapshotClass

kind: VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1
metadata:
  name: volume-snapshot-class
  annotations:
    snapshot.storage.kubernetes.io/is-default-class: "true"
driver: pd.csi.storage.gke.io
deletionPolicy: Delete

建完後,使用下面指令查看

kubectl get vsclass

p.s. 可用 kubectl api-resources 查詢縮寫

ref. Volume Snapshot Classes

Step 4. 建立VolumeSnapshot

指定要備份的pvc

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: postgres-snapshot
  namespace: database
spec:
  volumeSnapshotClassName: volume-snapshot-class # change your vsclass
  source:
    persistentVolumeClaimName: postgres-pvc # change your pvc

建完後使用下面指令查看

kubectl get volumesnapshots -n database

原本是可以直接使用vs作為縮寫代替,
但跟我的virtualservice衝突。

VolumeSnapshot執行完後,會自動建立一個VolumeSnapshotContent。

kc get vsc -n database

269-fig.2.png

Step 5. 還原

建立一個pvc使用dataSource的方式還原,
底下的 storageClassName、dataSource.name 根據情況修改。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: restore-pvc
  namespace: database
spec:
  storageClassName: standard-rwo
  dataSource:
    name: postgres-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

單純執行建立pvc時,如出現錯誤

waiting for first consumer to be created before binding

這是由於storageClass的volumeBindingMode是 WaitForFirstConsumer

所以需要將deploy與pvc綁定,才能創建PV。

但這個只能備份一次,
還必須手動,
所以要全自動的話,
再看看要怎麼搞了。

ref.